/*
java.util.Map<k,v>集合
特点：
  1.是一个双列集合，一个元素包含两个值（一个key，一个value）
  2.一个元素的两个值类型可以相同，也可以不同
  3.key不允许重复，value可以
  4.key和value一一对应


java.util.HashMap<k,v>集合
  1.底层是哈希表
  2.HashMap也是无序的，存取时位置可能不一致

java.util.LinkedHashMap<k,v>集合
  1.底层是个哈希表+链表
  2.保证有序
   */


public class Demo{

    public static void main(String[] args) {
        Map<String,String> p = new HashMap<>();

        String p1 = map.put("1","1");       //将1，1放入p中，因为没有名字为1的key，所以返回值为null

        String p1 = map.put("1","2");        //因为1的key存在，所以替换为2，返回最初的值：1

        String p1 = map.remove("1");         //删除key，返回的是这个key的value，如果没有key则返回null


    }

}



/*
Map集合的遍历方法：通过键找值
 */



public class demo2{

    public static void main(String[] args) {
        Map<String,String> p = new HashMap<>();

        String p1 = map.put("1","1");

        Set<String> set = p.keySet();               //用这个方法把key全部取出来存到一个Set集合中

        Iterator<String> it = set.iterator();         //用迭代器遍历Set集合
        while (it.hasNext()){
            String key = it.next();
            String value = p.get(key);              //通过key找到value
        }

    }

}



/*
Map集合遍历第二种方法：使用Entry对象遍历
 */


public class demo3 {

    public static void main(String[] args) {
        Map<String, String> p = new HashMap<>();

        String p1 = map.put("1", "1");

        Set<Map.Entry<String, String>> set = p1.entrySet();//用这个方法将p1的多个Entry对象（）指的是一对key和value取出来，存储到一个Set集合中

        //遍历Set集合，获取每一个Entry对象
        Iterator<String> it = set.iterator();         //用迭代器遍历Set集合
        while (it.hasNext()) {
            Map.Entry<String, String> entry = it.next();
            String key = entry.getKey();
            Integer value = entry.getValue();
        }

    }
}



/*
    HashMap存储自定义类型的键值
       作为key的元素，必须将hashCode和equal重写，以保证key唯一
 */



public class demo4{

    public static void main(String[] args) {
        HashMap<String,person> map = new HashMap<>();

        map.put("北京",new Person("张三",18));
        map.put("北",new Person("三",15));
        map.put("京",new Person("li三",16));
        map.put("京",new Person("张",11));


        Set<String> set = map.keySet();
        for(String key : set){
            person value = map.get(key);           //利用加强型for遍历Map集合
        }


        HashMap<person,String> map = new HashMap<>();

        map.put(new Person("张三",18),"北京");
        map.put(new Person("三",15),"北");
        map.put(new Person("li三",16)"京");
        map.put(new Person("张",11),"京");

        Set<map.Entry<person,String>> set = map.keySet();     //利用加强型for遍历Map集合
        for( map.Entry<person,String> entry : set){
            person key = entry.getKey();
            String value = entry.getValue();                 //这里要重写方法
        }
    }

}


public class person{

    private String name;
    private int age;

}



/*
  java.util.LinkedHashMap<k,v>  HashMap的子类
  有序的集合
 */


public class demo4{

    public static void main(String[] args) {
        LinkedHashMap<String,person> map = new LinkedHashMap<>();

        map.put("北京",new Person("张三",18));
        map.put("北",new Person("三",15));
        map.put("京",new Person("li三",16));
        map.put("京",new Person("张",11));

    }

}




